package com.ihy.handler;

import com.alibaba.fastjson.JSON;
import com.ihy.vo.ResultResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.web.session.SessionInformationExpiredEvent;
import org.springframework.security.web.session.SessionInformationExpiredStrategy;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 会话过期处理器
 * <p>
 * Component注解：
 * 指示带注解的类是“组件”。当使用基于注解的配置和类路径扫描时，这些类被认为是自动检测的候选类。
 * 其他类级注解也可以被视为标识组件，通常是一种特殊类型的组件：例如@Repository注解或AspectJ的@Aspect注解。
 * <p>
 * Autowired注解:
 * 将构造函数、字段、setter方法或config方法标记为由Spring的依赖注入工具自动连接。
 * Autowired注解是按照类型（byType）装配依赖对象，默认情况下它要求依赖对象必须存在，如果允许null值，可以设置它的required属性为false。
 * 如果我们想使用按照名称（byName）来装配，可以结合@Qualifier注解一起使用。(通过类型匹配找到多个candidate,在没有@Qualifier、@Primary注解的情况下，会使用对象名作为最后的fallback匹配)
 * <p>
 * Override注解：
 * 指示方法声明旨在重写父类型中的方法声明。如果使用此注解类型对方法进行注解，则需要编译器生成错误消息，除非至少满足以下条件之一：
 * 该方法重写或实现在父类型中声明的方法。
 * 该方法具有一个重写的签名，该签名等同于在对象中声明的任何公共方法的签名。
 */
@Component
public class CustomizeSessionInformationExpiredStrategy implements SessionInformationExpiredStrategy {

    @Autowired
    private ResultResponse resultResponse;

    @Override
    public void onExpiredSessionDetected(SessionInformationExpiredEvent sessionInformationExpiredEvent) throws IOException {
        HttpServletResponse httpServletResponse = sessionInformationExpiredEvent.getResponse();
        httpServletResponse.setCharacterEncoding("UTF-8");
        httpServletResponse.setContentType("text/html;charset=utf8");
        resultResponse.setCode(203);
        resultResponse.setMessage("账户已下线");
        resultResponse.setData(null);
        httpServletResponse.getWriter().write(JSON.toJSONString(resultResponse));
    }
}
